// 声明该类所在的包名为 com.zhunaer.dao
package com.zhunaer.dao;

// 导入 com.zhunaer.entity 包下的 Order 类，用于后续方法的参数和返回值
import com.zhunaer.entity.Order;

// 导入 java.util 包下的 List 接口，用于处理集合类型的数据
import java.util.List;
// 导入 java.math 包下的 BigDecimal 类，用于精确的十进制运算
import java.math.BigDecimal;

/**
 * 订单数据访问对象（DAO）接口，定义了与订单相关的数据库操作方法。
 */
public interface OrderDao {
    /**
     * 创建一个新的订单。
     *
     * @param order 要创建的订单对象，包含订单的详细信息
     * @return 受影响的行数，如果订单创建成功则返回 1，否则返回 0
     */
    int createOrder(Order order);

    /**
     * 更新订单的状态。
     *
     * @param orderId 要更新状态的订单的 ID
     * @param status  新的订单状态
     * @return 受影响的行数，如果订单状态更新成功则返回 1，否则返回 0
     */
    int updateOrderStatus(int orderId, String status);

    /**
     * 根据订单 ID 查找订单。
     *
     * @param orderId 要查找的订单的 ID
     * @return 如果找到对应的订单，则返回该订单对象；否则返回 null
     */
    Order findOrderById(int orderId);

    /**
     * 根据用户 ID 查找该用户的所有订单。
     *
     * @param userId 要查找订单的用户的 ID
     * @return 包含该用户所有订单的列表，如果没有找到订单则返回空列表
     */
    List<Order> findOrdersByUser(int userId);

    /**
     * 扣除用户的余额。
     *
     * @param userId 用户的 ID
     * @param amount 要扣除的金额
     * @return 受影响的行数，如果余额扣除成功则返回 1，否则返回 0
     */
    int deductBalance(int userId, BigDecimal amount);

    /**
     * 更新订单的金额。
     *
     * @param orderId 要更新金额的订单的 ID
     * @param amount  新的订单金额
     * @return 受影响的行数，如果订单金额更新成功则返回 1，否则返回 0
     */
    int updateAmount(int orderId, BigDecimal amount);
}